package br.com.vilababy.sigvb.dao;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.NoResultException;

import br.com.vilababy.sigvb.SIGVBFactory;
import br.com.vilababy.sigvb.SIGVBUtil;
import br.com.vilababy.sigvb.constantes.RelacaoEnum;
import br.com.vilababy.sigvb.constantes.SIGVBEnum;
import br.com.vilababy.sigvb.modelo.Aluno;
import br.com.vilababy.sigvb.modelo.Autorizado;

public class AutorizadoDAO extends AbstractSIGVBDAO<Autorizado>{

	/**
	 * @author Diego Patrick da Silva Santos
	 */
	
	@Override
	public int getQuantidadeFiltrados() {
		this.consulta = new StringBuilder("SELECT COUNT (aut) FROM Autorizado aut");
		this.query = SIGVBFactory.getEM().createQuery(this.consulta.toString());
		Number totalRegistros = (Number) query.getSingleResult();
		return totalRegistros.intValue();
	}
	
	public Autorizado consultarPai(Aluno aluno) {
		this.consulta = new StringBuilder("FROM Autorizado a WHERE a.aluno = :aluno AND a.relacao = :pai");
		this.query = SIGVBFactory.getEM().createQuery(this.consulta.toString());
		this.query.setParameter("aluno", aluno);
		this.query.setParameter("pai", RelacaoEnum.PAI);
		
		try {
			return (Autorizado) this.query.getSingleResult();
		} catch (NullPointerException nex) {
			SIGVBUtil.adicionarMensagemErro(SIGVBUtil.getValorMensagem(SIGVBEnum.RESULTADO.getValor()), SIGVBUtil.getValorMensagem(SIGVBEnum.RESULTADO_VAZIO.getValor()));
			return new Autorizado();
		} catch (NoResultException rex) {
			SIGVBUtil.adicionarMensagemErro(SIGVBUtil.getValorMensagem(SIGVBEnum.RESULTADO.getValor()), SIGVBUtil.getValorMensagem(SIGVBEnum.RESULTADO_VAZIO.getValor()));
			return new Autorizado();
		}
	}
	
	public Autorizado consultarMae(Aluno aluno) {
		this.consulta = new StringBuilder("FROM Autorizado a WHERE a.aluno = :aluno AND a.relacao = :mae");
		this.query = SIGVBFactory.getEM().createQuery(this.consulta.toString());
		this.query.setParameter("aluno", aluno);
		this.query.setParameter("mae", RelacaoEnum.MAE);
		
		try {
			return (Autorizado) this.query.getSingleResult();
		} catch (NullPointerException nex) {
			SIGVBUtil.adicionarMensagemErro(SIGVBUtil.getValorMensagem(SIGVBEnum.RESULTADO.getValor()), SIGVBUtil.getValorMensagem(SIGVBEnum.RESULTADO_VAZIO.getValor()));
			return new Autorizado();
		} catch (NoResultException rex) {
			SIGVBUtil.adicionarMensagemErro(SIGVBUtil.getValorMensagem(SIGVBEnum.RESULTADO.getValor()), SIGVBUtil.getValorMensagem(SIGVBEnum.RESULTADO_VAZIO.getValor()));
			return new Autorizado();
		}
	}
	
	@SuppressWarnings("unchecked")
	public List<Autorizado> listarPaginacao(int primeiroRegistro, int totalRegistros) {
		this.consulta = new StringBuilder("FROM Autorizado a ORDER BY a.nome");
		this.query = SIGVBFactory.getEM().createQuery(this.consulta.toString());
		this.query.setFirstResult(primeiroRegistro);
		this.query.setMaxResults(totalRegistros);
		
		try{
			return (List<Autorizado>) this.query.getResultList();
		} catch (NullPointerException nex) {
			System.out.println("Resultado Nulo");
			return new ArrayList<Autorizado>();
		} catch (ClassCastException cex) {
			System.out.println("Cast na classe List<Autorizado> não realizado!");
			return new ArrayList<Autorizado>();
		} catch (NoResultException rex) {
			System.out.println("Não existe resultado para esta consulta!");
			return new ArrayList<Autorizado>();
		}
	}
}
